
#include "../ui.h"
#include "lvgl/lvgl.h"
#include<string.h>
#include<unistd.h>
#include"../patient_data.h"

extern const lv_img_dsc_t background;
LV_FONT_DECLARE(lv_font_fan_24);
// 全局组件
static lv_obj_t *list_cont;          // 挂号人列表容器
static lv_obj_t *no_patient_label;   // 无挂号人提示标签
static lv_obj_t *add_btn;            // 添加挂号人按钮

// 函数原型声明
static void add_btn_event_handler(lv_event_t *e);
static void patient_item_event_handler(lv_event_t *e);
static void create_patient_item(lv_obj_t *parent, const PatientInfo *info, uint32_t index);
static void update_list_visibility(void);

void ui_Screen5_screen_init(void)
{
    ui_Screen5 = lv_obj_create(NULL);
    lv_obj_clear_flag(ui_Screen5, LV_OBJ_FLAG_SCROLLABLE);      /// Flags
    lv_obj_set_style_bg_img_src(ui_Screen5, &background, LV_PART_MAIN | LV_STATE_DEFAULT);
    
    ui_Button7 = lv_btn_create(ui_Screen5);
    lv_obj_set_width(ui_Button7, 100);
    lv_obj_set_height(ui_Button7, 50);
    lv_obj_set_x(ui_Button7, 419);
    lv_obj_set_y(ui_Button7, -233);
    lv_obj_set_align(ui_Button7, LV_ALIGN_CENTER);
    lv_obj_add_flag(ui_Button7, LV_OBJ_FLAG_SCROLL_ON_FOCUS);     /// Flags
    lv_obj_clear_flag(ui_Button7, LV_OBJ_FLAG_SCROLLABLE);      /// Flags
    lv_obj_set_style_bg_color(ui_Button7, lv_color_hex(0xFFF5DF), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(ui_Button7, 255, LV_PART_MAIN | LV_STATE_DEFAULT);

    ui_Label7 = lv_label_create(ui_Screen5);
    lv_obj_set_width(ui_Label7, LV_SIZE_CONTENT);   /// 1
    lv_obj_set_height(ui_Label7, LV_SIZE_CONTENT);    /// 1
    lv_obj_set_x(ui_Label7, 418);
    lv_obj_set_y(ui_Label7, -233);
    lv_obj_set_align(ui_Label7, LV_ALIGN_CENTER);
    lv_label_set_text(ui_Label7, "ESC");
    lv_obj_set_style_text_font(ui_Label7, &ui_font_Font1, LV_PART_MAIN | LV_STATE_DEFAULT);

    lv_obj_add_event_cb(ui_Button7, ui_event_Button7, LV_EVENT_ALL, NULL);

    //1标题栏
    lv_obj_t *title_label = lv_label_create(ui_Screen5);
    lv_label_set_text(title_label, "选择挂号人");
    lv_obj_set_style_text_font(title_label, &lv_font_fan_24, 0);
    lv_obj_set_style_text_color(title_label, lv_color_hex(0x1E88E5), 0);
    lv_obj_align(title_label, LV_ALIGN_TOP_MID, 0, 50);  

    // 3. 挂号人列表容器（带滚动功能）
    list_cont = lv_list_create(ui_Screen5);
    lv_obj_set_size(list_cont, 400, 450);  
    lv_obj_align(list_cont, LV_ALIGN_CENTER, 0, 0);
    lv_obj_set_style_bg_color(list_cont, lv_color_white(), 0);
    lv_obj_set_style_radius(list_cont, 8, 0);
    lv_obj_set_style_shadow_width(list_cont, 2, 0);
    lv_obj_set_style_shadow_color(list_cont, lv_color_hex(0xEEEEEE), 0);

    // 4. 无挂号人提示标签（初始隐藏，无数据时显示）
    no_patient_label = lv_label_create(ui_Screen5);
    lv_label_set_text(no_patient_label, "暂无挂号人信息\n请点击【添加挂号人】按钮创建");
    lv_obj_set_style_text_font(no_patient_label, &lv_font_fan_24, 0);
    lv_obj_set_style_text_color(no_patient_label, lv_color_hex(0x999999), 0);
    lv_obj_set_style_text_align(no_patient_label, LV_TEXT_ALIGN_CENTER, 0);
    lv_obj_align(no_patient_label, LV_ALIGN_CENTER, 0, 0);
    lv_obj_add_flag(no_patient_label, LV_OBJ_FLAG_HIDDEN);  // 初始隐藏

    // 5. 添加挂号人按钮（固定在底部）
    add_btn = lv_btn_create(ui_Screen5);
    lv_obj_set_size(add_btn, 180, 50);
    lv_obj_align(add_btn, LV_ALIGN_BOTTOM_MID, 0, -60);  // 底部居中，留出边距
    lv_obj_set_style_bg_color(add_btn, lv_color_hex(0x4CAF50), 0);  // 绿色：区分确认/返回按钮
    lv_obj_set_style_radius(add_btn, 8, 0);
    lv_obj_add_event_cb(add_btn, add_btn_event_handler, LV_EVENT_CLICKED, NULL);

    //6 添加按钮标签
    lv_obj_t *add_btn_label = lv_label_create(add_btn);
    lv_label_set_text(add_btn_label, "添加挂号人");
    lv_obj_set_style_text_font(add_btn_label, &lv_font_fan_24, 0);
    lv_obj_set_style_text_color(add_btn_label, lv_color_white(), 0);
    lv_obj_center(add_btn_label);

    // 7. 初始化列表数据（加载已添加的挂号人)
    ui_Screen5_refresh_list();
    // 8. 加载当前屏幕
    lv_scr_load(ui_Screen5);

}

//点击添加挂号人，跳转至   ----挂号人信息界面
static void add_btn_event_handler(lv_event_t *e) {
    if (!e) return;

    //
    if (ui_Screen6 == NULL) {
        ui_Screen6_screen_init();
    } else {
        lv_scr_load(ui_Screen6);
    }  
}

// 刷新挂号人列表（添加新挂号人后调用）

void ui_Screen5_refresh_list(void) {
    if (!list_cont) return;

    // 1. 清空现有列表项
    lv_obj_clean(list_cont);

    // 2. 获取已添加的挂号人数量
    uint32_t patient_count = patient_get_count();  
    if (patient_count == 0) {
        // 无挂号人：显示提示，隐藏列表
        lv_obj_clear_flag(no_patient_label, LV_OBJ_FLAG_HIDDEN);
        lv_obj_add_flag(list_cont, LV_OBJ_FLAG_HIDDEN);
        return;
    }

    // 3. 有挂号人：隐藏提示，显示列表
    lv_obj_add_flag(no_patient_label, LV_OBJ_FLAG_HIDDEN);
    lv_obj_clear_flag(list_cont, LV_OBJ_FLAG_HIDDEN);

    // 4. 遍历创建挂号人列表项（关键修改：使用 patient_get_info() 获取指针）
    for (uint32_t i = 0; i < patient_count; i++) {
        // 通过你的接口获取第 i 个挂号人信息的指针
        PatientInfo *info = patient_get_info(i);  
        if (info != NULL) {  // 指针非空说明获取成功
            create_patient_item(list_cont, info, i);
        }
    }
}



static void create_patient_item(lv_obj_t *parent, const PatientInfo *info, uint32_t index) {
    if (!parent || !info) return;

    // 1. 创建列表项容器（带点击事件）
    lv_obj_t *item = lv_obj_create(parent);
    lv_obj_set_size(item, lv_pct(100), 150);  
    lv_obj_set_style_bg_color(item, lv_color_white(), 0);
    
    lv_obj_set_layout(item, LV_LAYOUT_FLEX);
    lv_obj_set_flex_flow(item, LV_FLEX_FLOW_COLUMN);
    lv_obj_set_flex_align(item, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
    

    // 2. 存储索引（选择时用于定位数据）
    lv_obj_set_user_data(item, (void *)index);

    // 3. 挂号人姓名（高亮显示）
    lv_obj_t *name_label = lv_label_create(item);
    char name_buf[64];
    snprintf(name_buf, sizeof(name_buf), "姓名：%s", info->name);
    lv_label_set_text(name_label, name_buf);
    lv_obj_set_style_text_font(name_label, &lv_font_fan_24, 0);
    lv_obj_set_style_text_color(name_label, lv_color_hex(0x1E88E5), 0);

    // 4. 挂号人详细信息（性别/年龄/电话）
    lv_obj_t *detail_label = lv_label_create(item);
    char detail_buf[128];
    const char *gender = info->gender == 0 ? "男" : "女";
    snprintf(detail_buf, sizeof(detail_buf), "性别：%s | 年龄：%d | 电话：%s", 
             gender, info->age, info->phone);
    lv_label_set_text(detail_label, detail_buf);
    lv_obj_set_style_text_font(detail_label, &lv_font_fan_24, 0);
    lv_obj_set_style_text_color(detail_label, lv_color_hex(0x555555), 0);

    // 5. 选择按钮（右侧）
    lv_obj_t *select_btn = lv_btn_create(item);
    lv_obj_set_size(select_btn, 100, 40);
    lv_obj_align(select_btn, LV_ALIGN_RIGHT_MID, -10, 0);
    lv_obj_set_style_bg_color(select_btn, lv_color_hex(0x1E88E5), 0);
    lv_obj_set_style_radius(select_btn, 5, 0);

    // 选择按钮标签
    lv_obj_t *select_btn_label = lv_label_create(select_btn);
    lv_label_set_text(select_btn_label, "选择");
    lv_obj_set_style_text_font(select_btn_label, &lv_font_fan_24, 0);
    lv_obj_set_style_text_color(select_btn_label, lv_color_white(), 0);
    lv_obj_center(select_btn_label);

    // 6. 绑定选择事件（点击后跳转挂号界面）
    lv_obj_add_event_cb(select_btn, patient_item_event_handler, LV_EVENT_CLICKED, item);
}

static void patient_item_event_handler(lv_event_t *e) {
    if (!e) return;

    // 1. 获取选择的挂号人索引
    lv_obj_t *item = lv_event_get_user_data(e);
    uint32_t selected_index = (uint32_t)lv_obj_get_user_data(item);

    // 2. 根据索引获取挂号人信息
    PatientInfo *selected_patient = patient_get_info(selected_index);
    if (selected_patient == NULL) {  // 指针为空说明获取失败
        // 获取失败提示
        lv_obj_t *msgbox = lv_msgbox_create(lv_scr_act(), "提示", "获取挂号人信息失败", 
                                           (const char *[]){"确定", NULL}, false);
        lv_obj_set_style_text_font(msgbox, &lv_font_fan_24, 0);
        lv_obj_center(msgbox);
        return;
    }

    
    // 后续挂号流程可通过 patient_get_selected() 获取当前选中的挂号人ID
    patient_set_selected(selected_patient->id);

    // 4. 跳转到挂号主界面（请替换为你的实际挂号界面，示例用 Screen4）
    if (ui_Screen7 == NULL) {
        ui_Screen7_screen_init();  // 确保目标界面已初始化
    }
    lv_scr_load(ui_Screen7);  // 切换到目标界面
}